from django.core.management.base import BaseCommand
from django.contrib.auth import get_user_model
from accounts.models import Menu, Role, Permission
from django.urls import reverse

User = get_user_model()


class Command(BaseCommand):
    help = '初始化系统：创建基本菜单和管理员组'

    def add_arguments(self, parser):
        parser.add_argument(
            '--admin-name',
            type=str,
            default='admin',
            help='管理员用户名，默认为admin',
        )
        parser.add_argument(
            '--admin-password',
            type=str,
            default='admin123',
            help='管理员密码，默认为admin123',
        )
        parser.add_argument(
            '--admin-email',
            type=str,
            default='admin@example.com',
            help='管理员邮箱，默认为admin@example.com',
        )

    def handle(self, *args, **options):
        # 创建基本菜单
        self.create_menus()

        # 创建管理员组（角色）
        self.create_admin_role()

        # 创建管理员用户
        self.create_admin_user(options)

        self.stdout.write(
            self.style.SUCCESS('系统初始化完成！')
        )

    def create_menus(self):
        """创建基本菜单"""
        self.stdout.write('正在创建基本菜单...')

        # 首先创建顶级菜单（应用）
        accounts_menu, created = Menu.objects.get_or_create(
            name='系统管理',
            defaults={
                'url': '',
                'icon': 'fas fa-cogs',
                'order': 1
            }
        )
        if created:
            self.stdout.write(f'创建顶级菜单: {accounts_menu.name}')

        # 创建账户管理子菜单
        dashboard_menu, created = Menu.objects.get_or_create(
            name='仪表板',
            defaults={
                'url': 'accounts:dashboard',
                'parent': accounts_menu,
                'icon': 'fas fa-tachometer-alt',
                'order': 1
            }
        )
        if created:
            self.stdout.write(f'创建子菜单: {dashboard_menu.name}')

        user_menu, created = Menu.objects.get_or_create(
            name='用户管理',
            defaults={
                'url': 'accounts:user_list',
                'parent': accounts_menu,
                'icon': 'fas fa-users',
                'order': 2
            }
        )
        if created:
            self.stdout.write(f'创建子菜单: {user_menu.name}')

        role_menu, created = Menu.objects.get_or_create(
            name='角色管理',
            defaults={
                'url': 'accounts:role_list',
                'parent': accounts_menu,
                'icon': 'fas fa-user-tag',
                'order': 3
            }
        )
        if created:
            self.stdout.write(f'创建子菜单: {role_menu.name}')

        menu_menu, created = Menu.objects.get_or_create(
            name='菜单管理',
            defaults={
                'url': 'accounts:menu_list',
                'parent': accounts_menu,
                'icon': 'fas fa-bars',
                'order': 4
            }
        )
        if created:
            self.stdout.write(f'创建子菜单: {menu_menu.name}')

        permission_menu, created = Menu.objects.get_or_create(
            name='权限同步',
            defaults={
                'url': 'accounts:sync_permissions',
                'parent': accounts_menu,
                'icon': 'fas fa-sync',
                'order': 5
            }
        )
        if created:
            self.stdout.write(f'创建子菜单: {permission_menu.name}')

    def create_admin_role(self):
        """创建管理员角色并分配权限"""
        self.stdout.write('正在创建管理员角色...')

        # 创建管理员角色
        admin_role, created = Role.objects.get_or_create(
            name='管理员',
            defaults={
                'description': '系统管理员角色，拥有所有权限'
            }
        )
        if created:
            self.stdout.write(f'创建角色: {admin_role.name}')

        # 获取所有权限并分配给管理员角色
        all_permissions = Permission.objects.all()
        admin_role.permissions.set(all_permissions)
        self.stdout.write(f'为角色"{admin_role.name}"分配了{all_permissions.count()}个权限')

        # 为管理员角色分配所有菜单
        all_menus = Menu.objects.all()
        admin_role.menus.set(all_menus)
        self.stdout.write(f'为角色"{admin_role.name}"分配了{all_menus.count()}个菜单')

    def create_admin_user(self, options):
        """创建管理员用户"""
        admin_name = options['admin_name']
        admin_password = options['admin_password']
        admin_email = options['admin_email']

        self.stdout.write('正在创建管理员用户...')

        # 检查是否已存在同名用户
        if User.objects.filter(username=admin_name).exists():
            self.stdout.write(self.style.WARNING(f'用户"{admin_name}"已存在，跳过创建'))
            return

        # 创建超级用户
        admin_user = User.objects.create_superuser(
            username=admin_name,
            password=admin_password,
            email=admin_email
        )
        self.stdout.write(f'创建管理员用户: {admin_user.username}')

        # 为管理员用户分配管理员角色
        admin_role = Role.objects.get(name='管理员')
        admin_user.roles.add(admin_role)
        self.stdout.write(f'为用户"{admin_user.username}"分配了"{admin_role.name}"角色')